package cn.yh.shop.product.action;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

import cn.yh.shop.product.model.Cart;
import cn.yh.shop.product.model.CartItem;
import cn.yh.shop.product.service.impl.CartServiceImpl;
import cn.yh.shop.user.model.User;
import cn.yh.shop.user.service.IUserOrderService;
import cn.yh.shop.util.Cart2UserOrder;
/**
 * @Description:购物车的处理类
 * @author:"李战召"
 * @time:2016年12月16日 下午5:18:58
 */
@Controller("cartAction")
@Scope("prototype")
public class CartAction extends ActionSupport implements ModelDriven<CartItem>{
	private HttpServletResponse  response ; 
	private Map<String, Object> session;
	private PrintWriter out;
	private static Integer userId;
	private static Logger logger = LogManager.getLogger(CartAction.class);
	/**
	 * @Description: serialVersionUID : TODO
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * @Description: cartService : spring自动注入
	 */
	@Autowired
	private CartServiceImpl  cartService;
	/**
	 * @Description: userOrderServiceImpl : 订单的服务自动注入
	 */
	@Autowired
	private IUserOrderService  userOrderServiceImpl;
	/**
	 * @Description: cart : 购物车
	 */
	@Autowired
	private Cart  cart;
	/**
	 * @Description: cartItem : 购物车项
	 */
	@Autowired
	private CartItem  cartItem;
	/**
	 * @Description: flag : 购物车项是否被选中的标志位(在pay页面的时候去保存,过来的状态)
	 */
	private static String  flags="";
	/**
	 * @Description: goodids : goodids是个拼接的字符串,封装了goodId,tasteId和pakageId信息
	 */
	private String  goodIds;
	
	public CartAction() {
		response = ServletActionContext.getResponse(); 
		session = ActionContext.getContext().getSession();
		userId=((User)session.get("data")).getId();
		logger.info("userId"+userId);
	}
	
	public String getGoodIds() {
		return goodIds;
	}

	public void setGoodIds(String goodIds) {
		this.goodIds = goodIds;
	}

	public CartItem getCartItem() {
		return cartItem;
	}

	public void setCartItem(CartItem cartItem) {
		this.cartItem = cartItem;
	}

	public void setCart(Cart cart) {
		this.cart = cart;
	}

	public Cart getCart() {
		return cart;
	}

	public String getFlags() {
		return flags;
	}

	public void setFlags(String flags) {
		this.flags = flags;
	}

	@Override
	public CartItem getModel() {
		return cartItem;
	}
	
	public String execute(){
		return "success";
	}
	
	/**
	 * @Description:返回从redis中取到的用户的购物车,然后返回cartJSON对象
	 * @return
	 * String
	 * @exception:
	 * @author: 李战召
	 * @time:2016年12月16日 下午8:19:33
	 */
	public String showCart(){
		//现在测试,写成死的
		cart = cartService.getCart(userId);
		//logger.info("cart:"+cart);
		return "success";
	}
	/**
	 * @Description:购物车修改商品数量
	 * @return
	 * String
	 * @exception:
	 * @author: "李战召"
	 * @time:2016年12月19日 上午10:50:32
	 */
	public String updateCartItem(){
		//现在测试,写成死的
		Integer  count = cartItem.getCount();
		logger.info("count:"+count);
		cartItem = cartService.getCartItem(userId,cartItem);
		cartItem.setCount(count);
		logger.info("cartItem:"+cartItem);
		cart = cartService.updateCart(userId, cartItem);
		logger.info("cart:"+cart);
		return "success";
	}
	/**
	 * @Description:删除购物车中的单项商品项
	 * @return
	 * String
	 * @exception:
	 * @author: "李战召"
	 * @time:2016年12月19日 下午2:20:51
	 */
	public String delCartItem(){
		//现在测试,写成死的
		logger.info("count"+cartItem.getGoodsId());
		cart = cartService.delCart(userId, cartItem);
		logger.info("cart:"+cart);
		return "success";
	}
	/**
	 * @Description:删除购物车中复选框选中的商品
	 * @return
	 * String
	 * @exception:
	 * @author: "李战召"
	 * @time:2016年12月19日 下午2:20:51
	 */
	public String delCartItems(){
		if(flags != ""){
		    flags = flags.substring(0, flags.lastIndexOf("-"));
		    String[] flag = flags.split("-");
		    for (String string : flag) {
		    	cartItem = cartService.getCartItem(userId,string);
		    	cartService.delCart(userId, cartItem);
			}
		}
		cart = cartService.getCart(userId);
		return "success";
	}
	
	/**
	 * @Description:从数据库中取得被选中的cart对象
	 * @return
	 * String
	 * @exception:
	 * @author: "李战召"
	 * @time:2016年12月19日 下午2:22:04
	 */
	public String showCartByChecked(){
		//现在测试,写成死的
		logger.info("flags"+flags);
		cart = new Cart();  //cart new一个新的对象
		cart.setUserid(userId); //设置cart的userid
		if(flags != ""){
		    String flags1 = flags.substring(0, flags.lastIndexOf("-"));
		    String[] flag = flags1.split("-");
		    for (String string : flag) {
				  cartItem = cartService.getCartItem(userId,string);
				  cart.addItem(cartItem);  //放入购物车中
				}
		    	flags="";  //用完之后清空为空字符串
				logger.info("cart by :"+cart);
			}else{
				Map<String, Object> session = ActionContext.getContext().getSession();
				CartItem object = (CartItem)session.get("payInfo");
				cart.addItem(object);
				//session.remove("payInfo"); 生成订单之后移除
			}
		return "success";
	}
	/**
	 * @Description:从提交页面更改购物车的信息
	 * @return
	 * String
	 * @exception:
	 * @author: "李战召"
	 * @time:2016年12月19日 下午5:20:33
	 */
	public String updateCartItemByChecked(){
		//现在测试,写成死的
		Integer  count = cartItem.getCount();
		logger.info("count:"+count);
		cartItem = cartService.getCartItem(userId,cartItem);
		cartItem.setCount(count);
		logger.info("cartItem:"+cartItem);
		cartService.updateCart(userId, cartItem); //执行更新
		cart = cartService.getCartByChecked(userId);  //从新获取更改过的被选中的商品项的购物车
		logger.info("cart:"+cart);
		return "success";
	}
	
	/**
	 * @Description:更改购物车的状态(是否被选中,选择的才可以进入支付页面,给flags赋值)
	 * @return
	 * String
	 * @exception:
	 * @author: "李战召"
	 * @time:2016年12月19日 下午6:40:53
	 */
	public String updateCartItemFlag(){
		return "success";
	}
	
	/**
	 * @Description:把一个商品加入购物车,添加成功,前台提示成功
	 * @return
	 * String
	 * @exception:
	 * @author: "李战召"
	 * @time:2016年12月19日 下午8:29:34
	 */
	public void addOneCart(){
		try {
			out = response.getWriter();
			String result = "err";
			//现在测试,写成死的
			int i = cartService.addCart(userId, cartItem);
			//logger.info("cart:"+cart);
			if(i == 1){
				result = "ok";
			}
			out.print(result);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * @Description:生成订单
	 * @return
	 * String
	 * @exception:
	 * @author: 李战召
	 * @time:2016年12月22日 下午6:36:42
	 */
	public void cart2Order(){
		Map<String, Object> session = ActionContext.getContext().getSession(); //session对象
		logger.info("flags"+flags);
		cart = new Cart();  //cart new一个新的对象
		cart.setUserid(userId);
		boolean b = false;  //判断是直接购买还是从redis数据库生成的
		if(flags != ""){
		    String flags1 = flags.substring(0, flags.lastIndexOf("-"));
		    String[] flag = flags1.split("-");
		    for (String string : flag) {
				  cartItem = cartService.getCartItem(userId,string);
				  if(cartItem == null){
					  b = true; //说明是直接购买的
					  break;
				  }
				  cart.addItem(cartItem);  //放入购物车中
				}
		     if(b){  //直接购买是存在session中的
					CartItem object = (CartItem)session.get("payInfo");
					cart.addItem(object);
		     }
		    	
				logger.info("cart by :"+cart);
			}
		
		
		try {
			out = response.getWriter();
			String result = "err";
			if(userOrderServiceImpl.createOrder(new Cart2UserOrder().toUserOrder(cart)) > 0){
				result = "ok";
				if(b){
					session.remove("payInfo"); //生成订单之后移除session
				}else{
					 flags = flags.substring(0, flags.lastIndexOf("-"));
					    String[] flag = flags.split("-");
					    for (String string : flag) {
					    	cartItem = cartService.getCartItem(userId,string);
					    	cartService.delCart(userId, cartItem);
						}
					    flags="";  //使用完之后置为空字符串
				}
				
			} //如果大于0说明订单成功
			out.print(result);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
